package function.client;

import function.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;

/**
 * @author G_Y
 * @version 1.0.0, 2022/3/29 15:33
 **/
@Component
@Slf4j
public class UserClient {

    @Reference(version = "1.0.0", check = false, retries = 1)
    private UserFacade userFacade;

    /**
     * 查询用户信息
     *
     * @author G_Y, 2022/3/29 16:04
     **/
    public Result<RespUserInfo> queryUserInfo(QueryUserRequest request) {

        // 实体转换
        QueryUserInfoDTO reqDto = this.exchange(request);

        RpcResult<UserInfoDTO> rpcResult;
        try {
            // 远程请求
            rpcResult = userFacade.queryUserInfo(reqDto);
        } catch (Exception e) {
            // 记录日志，入参、异常信息
            return Result.failed();
        }

        if (log.isDebugEnabled()) {
            log.debug("RPC获取用户信息，请求参数：{}，响应结果：{}", reqDto, rpcResult);
        }

        if (rpcResult.isFailed()) {
            // 记录日志，入参、响应
            return Result.failed();
        }
        if (rpcResult.getData() == null) {
            // 记录日志，入参、响应
            return Result.failed();
        }
        if (StringUtils.isEmpty(rpcResult.getData().getPhone())) {
            // 不符合业务期望，约定之外的情况，记录日志，入参、响应
            return Result.failed();
        }

        // 实体转换
        RespUserInfo respUserInfo = this.exchange(rpcResult.getData());

        return Result.success(respUserInfo);

    }

    /**
     * 奖励用户积分
     *
     * @author G_Y, 2022/3/29 16:05
     **/
    public Result<Void> rewardPoints(rewardPointsRequest request) {

        // 实体转换
        rewardPointsRequestDTO reqDto = this.exchange(request);

        RpcResult<Boolean> rpcResult;
        try {
            // 远程请求
            rpcResult = userFacade.rewardPoints(reqDto);
        } catch (Exception e) {
            // 记录日志，入参、异常信息
            return Result.failed();
        }

        if (log.isDebugEnabled()) {
            log.debug("奖励用户积分，请求参数：{}，响应结果：{}", reqDto, rpcResult);
        }

        if (rpcResult.isFailed()) {
            // 记录日志，入参、响应
            return Result.failed();
        }
        if (rpcResult.getData() == null) {
            // 记录日志，入参、响应
            return Result.failed();
        }
        if (!rpcResult.getData()) {
            // 不符合业务期望，约定之外的情况，记录日志，入参、响应
            return Result.failed();
        }

        return Result.success();

    }


    private QueryUserInfoDTO exchange(QueryUserRequest request) {
        return null;
    }

    private RespUserInfo exchange(UserInfoDTO request) {
        return null;
    }

    private rewardPointsRequestDTO exchange(rewardPointsRequest request) {
        return null;
    }
    // other methods ...

}
